<?php

class MD5Utils
{

    private const SALT_LENGTH = 16; // 盐的长度
    private const HASH_ITERATIONS = 1000; // MD5 迭代次数

    // 生成随机盐
    public static function generateSalt(): string {
        return bin2hex(random_bytes(self::SALT_LENGTH));
    }

    // 使用 MD5 进行加密
    public static function hashPassword(string $password, string $salt): string {
        $saltedPassword = $salt . $password; // 先拼接盐和密码
        $hash = md5($saltedPassword); // 第一次 MD5

        // 进行多次哈希增加破解难度
        for ($i = 0; $i < self::HASH_ITERATIONS; $i++) {
            $hash = md5($hash . $salt);
        }

        return $hash;
    }

    // 验证密码
    public static function verifyPassword(string $password, string $storedHash, string $salt): bool {
        return self::hashPassword($password, $salt) === $storedHash;
    }

}

$password = "aini1314"; // 用户输入的密码
$salt = MD5Utils::generateSalt(); // 生成盐
$hashedPassword = MD5Utils::hashPassword($password, $salt); // 生成哈希

// 模拟存储和验证
$isValid = MD5Utils::verifyPassword("MySecurePassword123", $hashedPassword, $salt);

echo "生成的盐: $salt\n";
echo "加密后的密码: $hashedPassword\n";
echo "原密码: $password\n";
echo "密码验证结果: " . ($isValid ? "正确" : "错误") . "\n";